package x.ovo.wechat.bot.common.http;

import x.ovo.wechat.bot.common.http.request.ApiRequest;

import java.net.HttpCookie;
import java.util.List;
import java.util.function.Function;

/**
 * HTTP 引擎接口
 * 用于发起HTTP请求并处理响应。
 *
 * @author ovo, created by 2024/05/04
 */
public interface HttpEngine<E> {
    /**
     * 初始化HTTP引擎。
     * 使用配置对象对HTTP引擎进行初始化设置。
     *
     * @param config 引擎配置对象，包含HTTP引擎初始化所需的配置信息。
     */
    void init(final EngineConfig config);

    /**
     * 执行HTTP请求。
     * 根据提供的API请求对象发起请求，并返回相应的API响应对象。
     *
     * @param request API请求对象，包含请求的参数和配置信息。
     * @param <T>     响应类型，继承自ApiResponse，用于指定返回的响应对象类型。
     * @return 执行请求后返回的响应对象，类型为T。
     */
    <T> T execute(final ApiRequest<T> request, Function<String, T> responseHandler);

    /**
     * 获取当前所有Cookie的方法。
     *
     * @return List<HttpCookie> 返回一个HttpCookie对象的列表，包含了所有当前的Cookie。
     */
    List<HttpCookie> getCookies();

    /**
     * 获取原始引擎的实例。
     *
     * @return 返回类型为 T 的原始引擎实例。这个方法没有参数。
     */
    E getRawEngine();

}
